<?php
/**
 * huhaiqin,2025.2.5
 * 游戏模块关卡接口
 */
namespace Game\Controller;
use Think\Controller;
use Game\Controller\GameBaseController;
use Game\Service\GameUserService;

class StageController extends GameBaseController{

    /**
     * huhaiqin,2025.2.5
     * 开始游戏接口
     * //请求参数
     *   token: string //用户token,
     *  stage_id: int //关卡id
     *  //返回参数
     *  stage_id: int//当前所在关卡
     *   energy_recover_timestamp: long //体力完全恢复的时间点
     */
    public function game_start(){
        $stage_id = I('stage_id');
        if(!$stage_id){
            _apiReturn(0, '关卡id不能为空');
            return;
        }
        $stage = _get_config_table()->getTbStage()->get($stage_id);
        if(!$stage){
            _apiReturn(0, '关卡不存在');
            return;
        }
        $res = D('GameUser', 'Service')->game_start($this->_uid, $stage_id);
        if(!$res['status']){
            _apiReturn(0, $res['msg']);
            return;
        }
        _write_user_log($this->_uid, 'game_start', $stage_id);
        _apiReturn(1, '开始游戏成功', ['stage_id' => $stage_id, 'energy' => $res['data']['energy'], 'user_info' => $this->_get_full_user_info() ]);

    }

    /**
     * huhaiqin,2025.2.5
     * 结束游戏接口
     * //请求参数
     *   token: string //用户token,
     *   stage_id: int //关卡id
     *  result: string //是否过关 success fail
     *  //返回参数
     *   stage: int//当前所在关卡
     *  backpack：{} //背包 key-道具ID value-道具数量 （可以全量，也可以只发数量发生改变的道具）
     */
    public function game_end(){
        $stage_id = I('stage_id');
        if(!$stage_id){
            _apiReturn(0, '关卡id不能为空');
            return;
        }
        // 验证是否虚假闯关
        // 可以加上时间戳验证
        // $sign = hash_hmac('sha256', $stage_id, C('VERIFY_SECRET_KEY'));
        // if($sign!= I('sign')){
        //     _apiReturn(0, '关卡id不合法');
        //     return;
        // }
        $stage = _get_config_table()->getTbStage()->get($stage_id);
        if(!$stage){
            _apiReturn(0, '关卡不存在');
            return;
        }
        if(!I('result')){
            _apiReturn(0, '游戏结果不能为空');
            return; 
        }
        $result = I('result');
        $distance = I('distance', 0);
        $res = D('GameUser', 'Service')->game_end($this->_uid, $stage_id, $result, $distance);
        if(!$res['status']){
            _apiReturn(0, $res['msg']);
            return; 
        }
        _write_user_log($this->_uid, 'game_end', ['stage_id' => $stage_id, 'result' => $result, 'distance' => $distance], $res['data']['reward_item_list']);
        _apiReturn(1, '关卡结算成功', ['stage_id' => $stage_id, 'reward_item_list' => $res['data']['reward_item_list'], 'reward_token' => $res['data']['reward_token'], 'upgrade_item_list' => $res['data']['upgrade_item_list'], 'collect_rate' => $res['data']['collect_rate'], 'favorability_rate' => $res['data']['favorability_rate'], 'user_info' => $this->_get_full_user_info() ]);
    }

    /**
     * huhaiqin,2025.2.5
     * 领取关卡奖励
     * //请求参数
     *   token: string //用户token,
     *   stage_id: int //关卡id
     *  //返回参数
     *  reward_item_list: int//当前所在关卡
    */
    public function claim_stage_reward(){
        $stage_id = I('stage_id');
        if(!$stage_id){
            _apiReturn(0, '关卡id不能为空');
            return;
        }
        $stage = _get_config_table()->getTbStage()->get($stage_id);
        if(!$stage){
            _apiReturn(0, '关卡不存在');
            return;
        }
        $res = D('GameUser', 'Service')->claim_stage_reward($this->_uid, $stage_id);
        if(!$res['status']){
            _apiReturn(0, $res['msg']);
            return;
        }
        _write_user_log($this->_uid, 'claim_stage_reward', $stage_id, $res['data']['reward_item_list']);
        _apiReturn(1, '奖励领取成功', ['reward_item_list' => $res['data']['reward_item_list'], 'user_info' => $this->_get_full_user_info()]);
        
    }

    /**
     * 领取额外奖励
     * //请求参数
     *   token: string //用户token,
     *   stage_id: int //关卡id
     * //返回参数
     *  reward_item_list: int//当前所在关卡
     */
    public function claim_extra_reward(){
        $reward_token = I('reward_token');
        if(!$reward_token || !_get_reward_cache($reward_token)){
            _apiReturn(0, '奖励不存在或已无法领取');
            return;
        }
        $rate = I('rate', 1);
        $res = D('GameUser', 'Service')->claim_extra_reward($this->_uid, $reward_token, $rate);
        if(!$res['status']){
            _apiReturn(0, $res['msg']);
            return;
        }
        _write_user_log($this->_uid, 'claim_extra_reward', $rate, $res['data']['reward_item_list']);
        _apiReturn(1,'奖励领取成功', ['reward_item_list' => $res['data']['reward_item_list'], 'user_info' => $this->_get_full_user_info()]);

        
    }
}